package ddddbb.gen; import java.text.DecimalFormat; import java.text.ParseException; import javax.swing.JFormattedTextField; import javax.swing.JSpinner; import javax.swing.SpinnerModel; import javax.swing.SwingConstants; import javax.swing.text.DefaultFormatterFactory; import javax.swing.text.NumberFormatter; public class DoubleSpinner extends JSpinner { private static final long serialVersionUID = -3019586499647562767L; public DoubleSpinner(SpinnerModel sm) { super(sm); setEditor(new MyNumberEditor(this)); } public DoubleSpinner(SpinnerModel sm, DecimalFormat f) { super(sm); setEditor(new MyNumberEditor(this,f)); } public static class MyNumberEditor extends JSpinner.DefaultEditor { private static final long serialVersionUID = 7075682671710400052L; public MyNumberEditor(JSpinner spinner) { super(spinner); initialize(spinner,new DecimalFormat()); } public MyNumberEditor(JSpinner spinner, DecimalFormat format) { super(spinner); initialize(spinner, format); } private void initialize(JSpinner spinner, DecimalFormat format) { SpinnerModel model = spinner.getModel(); NumberFormatter formatter = new NumberFormatter(format); DefaultFormatterFactory factory = new DefaultFormatterFactory( formatter); JFormattedTextField ftf = getTextField(); ftf.setEditable(true); ftf.setFormatterFactory(factory); ftf.setHorizontalAlignment(SwingConstants.RIGHT); /* TBD - initializing the column width of the text field * is imprecise and doing it here is tricky because * the developer may configure the formatter later. */ try { String valString = formatter.valueToString(model.getNextValue()); ftf.setColumns(valString.length()); } catch (ParseException e) { // TBD should throw a chained error here } } } }